/**
 * 打字效果Web Worker
 * 在后台线程中控制打字机效果，确保即使页面不可见时也能继续打字
 * 固定速度为30
 */

// 状态变量
let tasks = {}; // 存储所有任务
let messageQueue = {}; // 存储待发送的消息

// 主要消息处理
self.onmessage = function(e) {
  const data = e.data;
  
  // 开始新的打字任务
  if (data.text && data.id) {
    const taskId = data.id;
    const text = data.text;
    const speed = data.speed || 30;
    
    // 创建或更新任务
    tasks[taskId] = {
      text,
      speed,
      currentIndex: 0,
      pauseStatus: false,
      isCanceled: false,
      startTime: Date.now(),
      lastUpdateTime: Date.now(),
      timer: null
    };
    
    // 清空该任务的消息队列
    messageQueue[taskId] = [];
    
    // 启动打字任务
    startTyping(taskId);
    return;
  }
  
  // 更新现有任务的速度
  if (data.updateSpeed && data.id) {
    const taskId = data.id;
    if (tasks[taskId]) {
      tasks[taskId].speed = data.speed || tasks[taskId].speed;
      
      // 如果强制激活，确保任务在运行
      if (data.forceActive && !tasks[taskId].timer) {
        startTyping(taskId);
      }
    }
    return;
  }
  
  // 暂停任务 - 立即停止所有输出
  if (data.pause && data.id) {
    const taskId = data.id;
    if (tasks[taskId]) {
      tasks[taskId].pauseStatus = true;
      
      // 清除定时器
      clearTimeout(tasks[taskId].timer);
      tasks[taskId].timer = null;
      
      // 清空待发送的消息队列
      if (messageQueue[taskId]) {
        messageQueue[taskId] = [];
      }
    }
    return;
  }
  
  // 继续任务
  if (data.resume && data.id) {
    const taskId = data.id;
    if (tasks[taskId] && tasks[taskId].pauseStatus) {
      tasks[taskId].pauseStatus = false;
      // 重新启动打字
      startTyping(taskId);
    }
    return;
  }
  
  // 取消任务 - 立即停止所有处理
  if (data.cancel && data.id) {
    const taskId = data.id;
    if (tasks[taskId]) {
      // 标记为已取消并清除定时器
      tasks[taskId].isCanceled = true;
      clearTimeout(tasks[taskId].timer);
      tasks[taskId].timer = null;
      
      // 清空待发送的消息队列
      if (messageQueue[taskId]) {
        messageQueue[taskId] = [];
      }
      
      // 通知已取消
      self.postMessage({
        id: taskId,
        text: tasks[taskId].text.substring(0, tasks[taskId].currentIndex),
        canceled: true
      });
      
      // 删除任务
      delete tasks[taskId];
      delete messageQueue[taskId];
    }
    return;
  }
};

// 执行打字效果的函数
function startTyping(taskId) {
  const task = tasks[taskId];
  if (!task) return;
  
  // 如果任务已暂停或取消，不执行
  if (task.pauseStatus || task.isCanceled) return;
  
  // 如果打字已完成
  if (task.currentIndex >= task.text.length) {
    // 直接发送完成消息，不经过队列
    self.postMessage({
      id: taskId,
      text: task.text,
      isDone: true
    });
    return;
  }
  
  // 更新当前文本
  task.currentIndex++;
  const currentText = task.text.substring(0, task.currentIndex);
  
  // 构造消息但不直接发送，而是检查暂停状态
  const message = {
    id: taskId,
    text: currentText,
    isDone: task.currentIndex >= task.text.length
  };
  
  // 检查任务是否处于暂停状态
  if (!task.pauseStatus && !task.isCanceled) {
    // 如果没有暂停，立即发送消息
    self.postMessage(message);
  }
  
  // 更新时间
  task.lastUpdateTime = Date.now();
  
  // 安排下一个字符
  task.timer = setTimeout(() => {
    // 再次检查是否暂停或取消
    if (!task.pauseStatus && !task.isCanceled) {
      startTyping(taskId);
    }
  }, task.speed);
}

// 定期发送心跳消息，确保Worker不被终止
setInterval(() => {
  self.postMessage({ heartbeat: true });
}, 30000);

console.log('[Worker] 打字效果Worker已启动，固定速度30ms每字符'); 